[qemu] Fix qemu memory access beyond 3G @VTi side.
authorchris@kneesaa.uk.xensource.com <chris@kneesaa.uk.xensource.com>
Fri, 4 Aug 2006 09:52:25 +0000 (10:52 +0100)
committerchris@kneesaa.uk.xensource.com <chris@kneesaa.uk.xensource.com>
Fri, 4 Aug 2006 09:52:25 +0000 (10:52 +0100)
Signed-off-by: Zhang xiantao <xiantao.zhang@intel.com>
tools/ioemu/vl.c

index b3ccf6b04a83433ab310c185e58b8a63bbfb94ed..010cc152e075bda3564601385bae778bd6cce64a 100644 (file)
@@ -5783,6 +5783,11 @@ int main(int argc, char **argv)
     /* init the memory */
     phys_ram_size = ram_size + vga_ram_size + bios_size;
 
+#if defined (__ia64__)
+    if (ram_size > MMIO_START)
+       ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
+#endif
+
 #ifdef CONFIG_DM
 
     nr_pages = ram_size/PAGE_SIZE;
@@ -5816,12 +5821,32 @@ int main(int argc, char **argv)
             (uint64_t)(page_array[nr_pages - 1]));
 
 #elif defined(__ia64__)
+  
+    if (xc_ia64_get_pfn_list(xc_handle, domid, page_array,
+                             IO_PAGE_START >> PAGE_SHIFT, 1) != 1) {
+        fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
+        exit(-1);
+    }
+
+    shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+                                       PROT_READ|PROT_WRITE,
+                                       page_array[0]);
+
+    fprintf(logfile, "shared page at pfn:%lx, mfn: %016lx\n",
+            IO_PAGE_START >> PAGE_SHIFT, page_array[0]);
+
     if (xc_ia64_get_pfn_list(xc_handle, domid,
                              page_array, 0, nr_pages) != nr_pages) {
         fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
         exit(-1);
     }
 
+    if (ram_size > MMIO_START) {       
+       for (i = 0 ; i < MEM_G >> PAGE_SHIFT; i++)
+           page_array[MMIO_START >> PAGE_SHIFT + i] =
+               page_array[IO_PAGE_START >> PAGE_SHIFT + 1];
+    }
+
     phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
                                          PROT_READ|PROT_WRITE,
                                          page_array, nr_pages);
@@ -5829,19 +5854,6 @@ int main(int argc, char **argv)
         fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
         exit(-1);
     }
-
-    if (xc_ia64_get_pfn_list(xc_handle, domid, page_array,
-                             IO_PAGE_START >> PAGE_SHIFT, 1) != 1){
-        fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
-        exit(-1);
-    }
-
-    shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
-                                       PROT_READ|PROT_WRITE,
-                                       page_array[0]);
-
-    fprintf(logfile, "shared page at pfn:%lx, mfn: %016lx\n",
-            IO_PAGE_START >> PAGE_SHIFT, page_array[0]);
 #endif
 #else  /* !CONFIG_DM */